const express = require("express")

const app = express()

// 定义用户名和密码的验证规则的中间件
const joi = require("joi")

// 用于jwt生成token 的秘钥
const jwtSecretKey = require("./config")


// 配置跨域中间件 必须放在路由的前面，不然还报跨域
const cors = require("cors")
app.use(cors())

// 配置解析表单的中间件 必须放在路由的前面,不然req.body就是undefined
const bodyParser = require("body-parser")
app.use(bodyParser.urlencoded({ extended: false }))

// 用于解密jwt字符串
const expressJwt = require("express-jwt")

// 解析客户端传来的jwt加密token
app.use(expressJwt({
    secret: jwtSecretKey.jwtSecretKey,
}).unless({ path: [/^\/api\//] }))

// 封装一下res.send 函数 简化下代码
app.use((req, res, next) => {
    // status 状态码 默认失败的情况下返回400
    // message 返回的信息
    res.cc = function (err, status = 400) {
        res.send({
            status: status,
            message: err instanceof Error ? err.message : err,
        })
    }
    next()
})

// 引入路由模块
const LoignRouter = require("./router/user")
const userInfoRouter = require("./router/userinfo")
const artCateRouter = require("./router/artcate")
// 注册路由模块artcateRouter
// 登录注册
app.use("/api", LoignRouter)
// 用户信息
app.use("/my", userInfoRouter)
// 文章相关
app.use("/my/artcate", artCateRouter)

// 定义获取错误的全局中间件
app.use(function (err, req, res, next) {
    // 数据验证失败
    if (err instanceof joi.ValidationError) return res.send({
        status: 400,
        message: err.message,
    })
    // 捕获身份认证失败的错误
    if (err.name === 'UnauthorizedError') return res.send({
        status: 400,
        message: "身份认证失败，请检查是否登录.",
    })
    // 未知错误
    res.send({
        status: 400,
        message: err.message,
    })
})


app.listen("3000", () => {
    console.log("http server is start in http://127.0.0.1:3000");
})